import java.awt.*;

public class Pallina implements Runnable {

	/**
	 * Costante per definire il coefficiente di attrito predefinito
	 */
	
	private final double ATTRITO = 0.2;
	
	/**
	 * Costante in millisecondi per calcolare l'accellerazione e la velocitÃ  della molla
	 */
	
	private final int sleep = 20;
	
	/**
	 * Costante per definire la massa predefinita
	 */
	
	private final int MASSA = 10;
	
	/**
	 * VelocitÃ  lungo l'asse x
	 */
	
	private int velocitaX;
	
	/**
	 * VelocitÃ  lungo l'asse y
	 */
	
	private int velocitaY;
	
	/**
	 * Posizione della coordinata x della pallina
	 */
	
	private int xPalla;
	
	/**
	 * Posizione della coordinata y della pallina
	 */
	
	private int yPalla;
	
	/**
	 * Massa della pallina
	 */
	
	private int massa;
	
	/**
	 * Coefficiente di attrito della pallina
	 */
	
	private double attrito;
	
	/**
	 * Diametro della pallina 
	 */
	
	private int diametroPalla;
	
	/**
	 * Thread della classe
	 */
	
	private Thread t;
	
	/**
	 * Oggetto Forza
	 */
	
	private Forza f;
	
	/**
	 * Colore della pallina
	 */
	
	private Color c;
	
	/**
	 * Costruttore della classe
	 * @param _diametroPalla Il diametro della pallina
	 */
	
	public Pallina(int _diametroPalla) {
		velocitaX = velocitaY = 0;
		t = new Thread(this);
		c = Color.BLUE;
		diametroPalla= _diametroPalla;
		massa = MASSA;
		attrito = ATTRITO;
	}
	
	/**
	 * Avvia il thread e ricalcola l'accellerazione e la velocitÃ 
	 */	
	
	public void run() {
		while(true) {
			try {
				t.sleep(sleep);
			}
			catch(InterruptedException e) { System.out.println("Eccezzione: "+e); }
			double forzaX = f.getX() -velocitaX*attrito;
			double forzaY = f.getY() -velocitaY*attrito;
			
			double accellerazionex = forzaX/massa;
			double accellerazioney = forzaY/massa;
			
			velocitaX +=accellerazionex;
			velocitaY +=accellerazioney;;
			
			xPalla += velocitaX;
			yPalla += velocitaY;
		}
	}
	
	/**
	 * Posizione lungo l'asse x della pallina 
	 * @return La coordinata x
	 */
	
	public int getX() {
		return xPalla;
	}
	
	/**
	 * Posizione lungo l'asse y della pallina 
	 * @return La coordinata y
	 */
		
	public int getY() {
		return yPalla;
	}
	
	/**
	 * Imposta l'oggetto Forza relativo alla pallina
	 * @param _f L'oggetto Forza
	 */
	
	public void setPointer(Forza _f) {
		f = _f;
	}

	/**
	 * Imposta il colore
	 * @param _c L'oggetto Color
	 */
	
	public void setColor(Color _c) {
		c = _c;
	}
	
	/**
	 * Imposta il colore in RGB
	 * @param _c Intero per creare il colore RGB
	 */
	
	public void setRgbColor(int _c){
		c = new Color(_c);
	}
	
	/**
	 * Ritorna il colore in RGB
	 * @return Il colore in RGB
	 */
	
	public int getRgbColor() {
		return c.getRGB();
	}
	
	/**
	 * Disegna la pallina sull'oggetto g
	 * @param g Oggetto Graphics
	 */
	
	public void  disegna(Graphics g){
		g.setColor(c);
		g.fillOval(xPalla -diametroPalla/2 , yPalla -diametroPalla/2 , diametroPalla, diametroPalla);
	}
	
	/**
	 * Avvia il thread
	 *
	 */
	
	public void startThread(){
		t.start();
	}

	/**
	 * Ritorna il diametro corrente della pallina
	 * @return Il diametro della pallina
	 */
	
	public int getDiametroPalla() {
		return diametroPalla;
	}

	/**
	 * Imposta il diametro della pallina
	 * @param _diametroPalla corrente
	 */
	
	public void setDiametroPalla(int _diametroPalla) {
		diametroPalla = _diametroPalla;
	}

	/**
	 * Ritorna il colore come oggetto Color
	 * @return L'oggetto Color
	 */
	
	public Color getC() {
		return c;
	}

	/**
	 * Imposta il colore
	 * @param c Oggetto Color
	 */
	
	public void setC(Color c) {
		this.c = c;
	}

	/**
	 * Ritorna la massa della pallina
	 * @return La massa
	 */
	
	public double getMassa() {
		return massa;
	}
	
	/**
	 * Imposta la massa della pallina
	 * @param _massa La massa
	 */
	
	public void setMassa(int _massa) {
		massa = _massa;
	}

	/**
	 * Ritorna il coefficiente di attrito impostato
	 * @return Il coefficiente di attrito
	 */
	
	public double getAttrito() {
		return attrito;
	}

	/**
	 * Imposta il coefficiente di attrito
	 * @param _attrito Il coefficiente di attrito
	 */
	
	public void setAttrito(double _attrito) {
		attrito = _attrito;
	}
	
}//Pallina
